home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / nn.zip / PATCH02 < prev    next >
Text File  |  1989-07-03  |  47KB  |  2,059 lines

  1. *** /usr/storm/nn6.3.1/patchlevel.h
  2. --- patchlevel.h
  3. **************
  4. *** 9,14
  5.    *    1989-05-30:  Distributed release 6.3    (World)
  6.    *
  7.    *    1989-06-06:  Patch 1: rc.c
  8.    */
  9.   
  10.   #define PATCHLEVEL 1
  11. --- 9,15 -----
  12.    *    1989-05-30:  Distributed release 6.3    (World)
  13.    *
  14.    *    1989-06-06:  Patch 1: rc.c
  15. +  *    1989-06-28:  Patch 2: several files
  16.    */
  17.   
  18.   #define PATCHLEVEL 2
  19. **************
  20. *** 11,15
  21.    *    1989-06-06:  Patch 1: rc.c
  22.    */
  23.   
  24. ! #define PATCHLEVEL 1
  25.   
  26. --- 12,16 -----
  27.    *    1989-06-28:  Patch 2: several files
  28.    */
  29.   
  30. ! #define PATCHLEVEL 2
  31.   
  32.  
  33. *** /usr/storm/nn6.3.0/answer.c
  34. --- answer.c
  35. **************
  36. *** 256,263
  37.           return 2;
  38.       }
  39.       } else {
  40. !     fputs("\rConfirm cancel: ", stdout); clrline();
  41. !     if (yes(1) <= 0) return 0;
  42.       }
  43.       
  44.       f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL);
  45. --- 256,263 -----
  46.           return 2;
  47.       }
  48.       } else {
  49. !     prompt("Confirm cancel: '%.50s'", ah->subject ? ah->subject : ""); 
  50. !     if (yes(1) <= 0) return 1;
  51.       }
  52.       
  53.       f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL);
  54. **************
  55. *** 262,268
  56.       
  57.       f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL);
  58.       if (f == NULL) {
  59. !     msg("Can't find original article");
  60.       return 2;
  61.       }
  62.       fclose(f);
  63. --- 262,268 -----
  64.       
  65.       f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL);
  66.       if (f == NULL) {
  67. !     msg("Article not found");
  68.       return 2;
  69.       }
  70.       fclose(f);
  71. **************
  72. *** 275,281
  73.       
  74.       if (aux_sh("cancel", 
  75.              news.ng_ident, current_group->group_name, "Not canceled"))
  76. !     return 3;
  77.           
  78.       return 1;
  79.   }
  80. --- 275,281 -----
  81.       
  82.       if (aux_sh("cancel", 
  83.              news.ng_ident, current_group->group_name, "Not canceled"))
  84. !     return -1;
  85.           
  86.       return 0;
  87.   }
  88. **************
  89. *** 277,283
  90.              news.ng_ident, current_group->group_name, "Not canceled"))
  91.       return 3;
  92.           
  93. !     return 1;
  94.   }
  95.   
  96.   
  97. --- 277,283 -----
  98.              news.ng_ident, current_group->group_name, "Not canceled"))
  99.       return -1;
  100.           
  101. !     return 0;
  102.   }
  103.   
  104.   
  105.  
  106. *** /usr/storm/nn6.3.0/data.h
  107. --- data.h
  108. **************
  109. *** 56,62
  110.   
  111.   #    define G_SUBSCRIPTION    CF(1)    /* from .rc */
  112.   #    define G_READ        CF(2)    /* group has been read    */
  113. - #    define G_RC_UPDATED    CF(3)    /* .rc is updated */
  114.   #    define G_DONE        CF(4)    /* finished with this group */
  115.   #    define G_NEW        CF(5)    /* new group */
  116.   #    define G_FOLDER        CF(6)    /* "group" is a folder file */
  117. --- 56,61 -----
  118.   
  119.   #    define G_SUBSCRIPTION    CF(1)    /* from .rc */
  120.   #    define G_READ        CF(2)    /* group has been read    */
  121.   #    define G_DONE        CF(4)    /* finished with this group */
  122.   #    define G_NEW        CF(5)    /* new group */
  123.   #    define G_FOLDER        CF(6)    /* "group" is a folder file */
  124.  
  125. *** /usr/storm/nn6.3.0/folder.c
  126. --- folder.c
  127. **************
  128. *** 402,408
  129.       int                cc_save;
  130.       
  131.       fake_group.group_name = path;
  132. !     fake_group.group_flag = G_RC_UPDATED | G_FOLDER | G_READ;
  133.       init_group(&fake_group);
  134.       
  135.       folder = open_file(group_path_name, OPEN_READ);
  136. --- 402,409 -----
  137.       int                cc_save;
  138.       
  139.       fake_group.group_name = path;
  140. !     fake_group.group_flag = G_FOLDER | G_READ;
  141. !     current_group = NULL;
  142.       init_group(&fake_group);
  143.       
  144.       folder = open_file(group_path_name, OPEN_READ);
  145. **************
  146. *** 486,493
  147.       if (cancel_count) {
  148.           clrdisp();
  149.           printf("Folder: %s\nFile:   %s\n\n", buffer, group_path_name);
  150. !         printf("Remove %d article%s from folder? ", 
  151. !            cancel_count, cancel_count == 1 ? "" : "s");
  152.           fl;
  153.           
  154.           switch (yes(1)) {
  155. --- 487,497 -----
  156.       if (cancel_count) {
  157.           clrdisp();
  158.           printf("Folder: %s\nFile:   %s\n\n", buffer, group_path_name);
  159. !         if (cancel_count == n_articles)
  160. !         printf("Cancel all articles and remove folder? ");
  161. !         else
  162. !         printf("Remove %d article%s from folder? ", 
  163. !                cancel_count, cancel_count == 1 ? "" : "s");
  164.           fl;
  165.           
  166.           switch (yes(1)) {
  167. **************
  168. *** 493,499
  169.           switch (yes(1)) {
  170.            case 1:
  171.           printf("\n\n");
  172. !         rewrite_folder();
  173.           break;
  174.            case 0:
  175.           break;
  176. --- 497,509 -----
  177.           switch (yes(1)) {
  178.            case 1:
  179.           printf("\n\n");
  180. !         if (cancel_count == n_articles) {
  181. !             if (unlink(group_path_name) < 0) {
  182. !             printf("Could not unlink %s\n", group_path_name);
  183. !             sleep(3);
  184. !             }
  185. !         } else
  186. !             rewrite_folder();
  187.           break;
  188.            case 0:
  189.           break;
  190. **************
  191. *** 526,533
  192.       
  193.       strcpy(oldfile, group_path_name);
  194.       sp = strrchr(oldfile, '/');
  195. !     if (!sp) goto move_error;
  196. !     strcpy(sp+1, "~OLD~FOLDER~");
  197.   
  198.       unlink(oldfile);
  199.       if (link(group_path_name, oldfile) < 0) goto move_error;
  200. --- 536,542 -----
  201.       
  202.       strcpy(oldfile, group_path_name);
  203.       sp = strrchr(oldfile, '/');
  204. !     strcpy((sp == NULL ? oldfile : sp+1), "~OLD~FOLDER~");
  205.   
  206.       unlink(oldfile);
  207.       if (link(group_path_name, oldfile) < 0) goto move_error;
  208.  
  209. *** /usr/storm/nn6.3.0/group.c
  210. --- group.c
  211. **************
  212. *** 376,383
  213.       if ((gh->last_article = gh->first_l_article - 1) < 0)
  214.           gh->last_article = 0;
  215.       gh->first_article = gh->last_article;
  216. !     updflag = gh->group_flag & (G_RC_UPDATED|G_READ);
  217. !     gh->group_flag &= ~(G_RC_UPDATED|G_READ);
  218.       update_rc(gh);
  219.       gh->group_flag &= ~(G_RC_UPDATED|G_READ);
  220.       gh->group_flag |= updflag;
  221. --- 376,383 -----
  222.       if ((gh->last_article = gh->first_l_article - 1) < 0)
  223.           gh->last_article = 0;
  224.       gh->first_article = gh->last_article;
  225. !     updflag = gh->group_flag & G_READ;
  226. !     gh->group_flag &= ~G_READ;
  227.       update_rc(gh);
  228.       gh->group_flag &= ~G_READ;
  229.       gh->group_flag |= updflag;
  230. **************
  231. *** 379,385
  232.       updflag = gh->group_flag & (G_RC_UPDATED|G_READ);
  233.       gh->group_flag &= ~(G_RC_UPDATED|G_READ);
  234.       update_rc(gh);
  235. !     gh->group_flag &= ~(G_RC_UPDATED|G_READ);
  236.       gh->group_flag |= updflag;
  237.       }
  238.   
  239. --- 379,385 -----
  240.       updflag = gh->group_flag & G_READ;
  241.       gh->group_flag &= ~G_READ;
  242.       update_rc(gh);
  243. !     gh->group_flag &= ~G_READ;
  244.       gh->group_flag |= updflag;
  245.       }
  246.   
  247. **************
  248. *** 455,461
  249.   
  250.       if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) {
  251.       if (did_selection) {
  252. !         int was_read = gh->group_flag & (G_READ|G_RC_UPDATED);
  253.   
  254.           prev_last = gh->last_l_article;
  255.           gh->last_l_article = last_article;
  256. --- 455,461 -----
  257.   
  258.       if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) {
  259.       if (did_selection) {
  260. !         int was_read = gh->group_flag & G_READ;
  261.   
  262.           prev_last = gh->last_l_article;
  263.           gh->last_l_article = last_article;
  264. **************
  265. *** 463,469
  266.           gh->last_l_article = prev_last;
  267.           
  268.           if (last_article < gh->last_l_article) {
  269. !         gh->group_flag &= ~ (G_READ|G_RC_UPDATED);
  270.           gh->group_flag |= was_read;
  271.           release_memory(&sel_marker);
  272.           goto after_selection;
  273. --- 463,469 -----
  274.           gh->last_l_article = prev_last;
  275.           
  276.           if (last_article < gh->last_l_article) {
  277. !         gh->group_flag &= ~G_READ;
  278.           gh->group_flag |= was_read;
  279.           release_memory(&sel_marker);
  280.           goto after_selection;
  281. **************
  282. *** 470,479
  283.           }
  284.       } else
  285.           if (submask == NULL && !also_read_articles &&
  286. !         (menu_cmd != ME_NO_ARTICLES || 
  287. !          (gh->group_flag & G_NEW) == 0) &&
  288. !         (first_art == -1 || 
  289. !          current_first_article == gh->first_article + 1))
  290.           update_rc(gh);
  291.       }
  292.       
  293. --- 470,478 -----
  294.           }
  295.       } else
  296.           if (submask == NULL && !also_read_articles &&
  297. !         (first_art == -1 || current_first_article == gh->first_article + 1)) {
  298. !         if (menu_cmd != ME_NO_ARTICLES)
  299. !             gh->group_flag &= ~G_NEW;
  300.           update_rc(gh);
  301.           }
  302.       }
  303. **************
  304. *** 475,480
  305.           (first_art == -1 || 
  306.            current_first_article == gh->first_article + 1))
  307.           update_rc(gh);
  308.       }
  309.       
  310.       current_first_article = o_first_article;
  311. --- 474,480 -----
  312.           if (menu_cmd != ME_NO_ARTICLES)
  313.               gh->group_flag &= ~G_NEW;
  314.           update_rc(gh);
  315. +         }
  316.       }
  317.       
  318.       current_first_article = o_first_article;
  319. **************
  320. *** 890,896
  321.       if (yes(0) <= 0) return 0;
  322.   
  323.       add_unread(gh, -1);
  324. !     gh->group_flag &= ~G_SUBSCRIPTION;
  325.       write_rc_entry(gh, 0);
  326.       return 1;
  327.       }
  328. --- 890,896 -----
  329.       if (yes(0) <= 0) return 0;
  330.   
  331.       add_unread(gh, -1);
  332. !     gh->group_flag &= ~(G_SUBSCRIPTION | G_NEW);
  333.       write_rc_entry(gh, 0);
  334.       return 1;
  335.       }
  336.  
  337. *** /usr/storm/nn6.3.0/keymap.c
  338. --- keymap.c
  339. **************
  340. *** 418,423
  341.       "compress",            K_COMPRESS,        K_ONLY_MORE,
  342.       "continue",            K_CONTINUE,        0,
  343.   
  344.       "find",            K_GOTO_MATCH,        K_ONLY_MORE,
  345.       "find-next",        K_NEXT_MATCH,        K_ONLY_MORE,
  346.       "follow",            K_FOLLOW_UP,        0,
  347. --- 418,425 -----
  348.       "compress",            K_COMPRESS,        K_ONLY_MORE,
  349.       "continue",            K_CONTINUE,        0,
  350.   
  351. +     "decode",            K_UUDECODE,        0,
  352.       "find",            K_GOTO_MATCH,        K_ONLY_MORE,
  353.       "find-next",        K_NEXT_MATCH,        K_ONLY_MORE,
  354.       "follow",            K_FOLLOW_UP,        0,
  355.  
  356. *** /usr/storm/nn6.3.0/keymap.h
  357. --- keymap.h
  358. **************
  359. *** 35,40
  360.   #define K_UNSUBSCRIBE        0x001b /* (un)subscribe to group     */
  361.   #define K_GROUP_OVERVIEW     0x001c /* group overview         */
  362.   #define K_PATCH            0x001d /* pipe article to patch         */
  363.   
  364.   #define K_GOTO_GROUP        0x0020 /* goto named group/folder    */
  365.   
  366. --- 35,41 -----
  367.   #define K_UNSUBSCRIBE        0x001b /* (un)subscribe to group     */
  368.   #define K_GROUP_OVERVIEW     0x001c /* group overview         */
  369.   #define K_PATCH            0x001d /* pipe article to patch         */
  370. + #define    K_UUDECODE        0x001e /* uudecode articles        */
  371.   
  372.   #define K_GOTO_GROUP        0x0020 /* goto named group/folder    */
  373.   
  374.  
  375. *** /usr/storm/nn6.3.0/init.c
  376. --- init.c
  377. **************
  378. *** 190,195
  379.       "cd",            2,    1,
  380.       "compile",            7,    0,
  381.       "coredump",            8,    0,
  382.       "define",            6,    0,
  383.       "help",            4,    2,
  384.       "man",            3,    0,
  385. --- 190,196 -----
  386.       "cd",            2,    1,
  387.       "compile",            7,    0,
  388.       "coredump",            8,    0,
  389. +     "decode",            6,    0,
  390.       "define",            6,    0,
  391.       "help",            4,    2,
  392.       "man",            3,    0,
  393. **************
  394. *** 550,557
  395.       }
  396.   
  397.       CASE( "unread" ) {
  398. !         if (restore_rc(current_group, argv(2) ? ARGVAL(2) : 0))
  399. !         return AC_HEADER;
  400.           break;
  401.       }
  402.       
  403. --- 551,566 -----
  404.       }
  405.   
  406.       CASE( "unread" ) {
  407. !         group_header *gh;
  408. !         int ix = 1;
  409. !         
  410. !         if (argv(1) && (gh = lookup(argv(1))) != NULL)
  411. !         ix = 2;
  412. !         else
  413. !         gh = current_group;
  414. !         
  415. !         if (restore_rc(gh, argv(ix) ? ARGVAL(ix) : 0))
  416. !         if (gh == current_group) return AC_HEADER;
  417.           break;
  418.       }
  419.       
  420.  
  421. *** /usr/storm/nn6.3.1/install_aux
  422. --- install_aux
  423. **************
  424. *** 26,32
  425.   
  426.       echo "INSTALLATION COMPLETED"
  427.   
  428. !     if [ -n "$2" ]
  429.       then
  430.           echo
  431.           echo "--------------------------------------------------------"
  432. --- 26,32 -----
  433.   
  434.       echo "INSTALLATION COMPLETED"
  435.   
  436. !     if [ $# -gt 1 ]
  437.       then
  438.           echo
  439.           echo "--------------------------------------------------------"
  440.  
  441. *** /usr/storm/nn6.3.0/MANIFEST
  442. --- MANIFEST
  443. **************
  444. *** 20,25
  445.   db.c
  446.   db.h
  447.   debug.h
  448.   digest.c
  449.   execute.c
  450.   expire.c
  451. --- 20,26 -----
  452.   db.c
  453.   db.h
  454.   debug.h
  455. + decode.c
  456.   digest.c
  457.   execute.c
  458.   expire.c
  459. **************
  460. *** 96,101
  461.   routes.sample
  462.   s-bsd4-2.h
  463.   s-bsd4-3.h
  464.   s-hpux.h
  465.   s-hpux2-1.h
  466.   s-sunos3.h
  467. --- 97,103 -----
  468.   routes.sample
  469.   s-bsd4-2.h
  470.   s-bsd4-3.h
  471. + s-dnix5-2.h
  472.   s-hpux.h
  473.   s-hpux2-1.h
  474.   s-hpux3-0.h
  475. **************
  476. *** 98,103
  477.   s-bsd4-3.h
  478.   s-hpux.h
  479.   s-hpux2-1.h
  480.   s-sunos3.h
  481.   s-sunos4-0.h
  482.   s-template.h
  483. --- 100,106 -----
  484.   s-dnix5-2.h
  485.   s-hpux.h
  486.   s-hpux2-1.h
  487. + s-hpux3-0.h
  488.   s-sunos3.h
  489.   s-sunos4-0.h
  490.   s-template.h
  491.  
  492. *** /usr/storm/nn6.3.0/menu.c
  493. --- menu.c
  494. **************
  495. *** 433,439
  496.        }
  497.   
  498.        last_k_cmd = cur_k_cmd;
  499. !      cur_k_cmd = k_cmd = get_k_cmd();
  500.        if (any_message) clrmsg(-1);
  501.   
  502.     alt_key:
  503. --- 433,439 -----
  504.        }
  505.   
  506.        last_k_cmd = cur_k_cmd;
  507. !      k_cmd = get_k_cmd();
  508.        if (any_message) clrmsg(-1);
  509.   
  510.     alt_key:
  511. **************
  512. *** 438,444
  513.   
  514.     alt_key:
  515.   
  516. !      switch (k_cmd) {
  517.   
  518.         case K_UNBOUND:
  519.        ding();
  520. --- 438,444 -----
  521.   
  522.     alt_key:
  523.   
  524. !      switch (cur_k_cmd = k_cmd) {
  525.   
  526.         case K_UNBOUND:
  527.        ding();
  528. **************
  529. *** 494,499
  530.         case K_QUIT:
  531.        menu_return(ME_QUIT);
  532.   
  533.         case K_SAVE_NO_HEADER:
  534.         case K_SAVE_SHORT_HEADER:
  535.         case K_SAVE_FULL_HEADER:
  536. --- 494,504 -----
  537.         case K_QUIT:
  538.        menu_return(ME_QUIT);
  539.   
  540. +       case K_CANCEL:
  541. +      savemode = "Cancel";
  542. +      fname = "";
  543. +      goto cancel1;
  544. +      
  545.         case K_SAVE_NO_HEADER:
  546.         case K_SAVE_SHORT_HEADER:
  547.         case K_SAVE_FULL_HEADER:
  548. **************
  549. *** 500,506
  550.         case K_PRINT:
  551.         case K_UNSHAR:
  552.         case K_PATCH:
  553.        if (numa < 0) goto nextmenu;
  554.   
  555.        fname = init_save(k_cmd, &savemode);
  556. --- 505,512 -----
  557.         case K_PRINT:
  558.         case K_UNSHAR:
  559.         case K_PATCH:
  560. !       case K_UUDECODE:
  561. !      
  562.        if (numa < 0) goto nextmenu;
  563.   
  564.        fname = init_save(k_cmd, &savemode);
  565. **************
  566. *** 506,511
  567.        fname = init_save(k_cmd, &savemode);
  568.        if (fname == NULL) goto Prompt;
  569.   
  570.        enable_stop = 0;
  571.        save_selected = 0;
  572.        doing_unshar = k_cmd == K_UNSHAR || k_cmd == K_PATCH;
  573. --- 512,518 -----
  574.        fname = init_save(k_cmd, &savemode);
  575.        if (fname == NULL) goto Prompt;
  576.   
  577. +       cancel1:
  578.        enable_stop = 0;
  579.        save_selected = 0;
  580.        doing_unshar = k_cmd == K_UNSHAR || k_cmd == K_PATCH;
  581. **************
  582. *** 542,547
  583.            ah = articles[article_id];
  584.            if (save_selected && (ah->flag & A_SELECT) == 0) continue;
  585.   
  586.            if (doing_unshar) {
  587.                did_unshar++;
  588.            } else
  589. --- 549,576 -----
  590.            ah = articles[article_id];
  591.            if (save_selected && (ah->flag & A_SELECT) == 0) continue;
  592.   
  593. +          if (cur_k_cmd == K_CANCEL) {
  594. +              if (current_group->group_flag & G_FOLDER) {
  595. +              if ((ah->flag & A_CANCEL) == 0) fcancel(ah);
  596. +              } else
  597. +              switch (cancel(ah)) {
  598. +               case -1:
  599. +                  did_unshar = 1;
  600. +                  continue;
  601. +               case 0:
  602. +                  ah->flag |= A_CANCEL;
  603. +                  break;
  604. +               default:
  605. +                  continue;
  606. +              }
  607. +              
  608. +              if (!did_unshar) {
  609. +              how = CANCEL;
  610. +              mark();
  611. +              }
  612. +              continue;
  613. +          }
  614.            if (doing_unshar) {
  615.                did_unshar++;
  616.            } else
  617. **************
  618. *** 547,552
  619.            } else
  620.            if (cura >= 0 && cura <= numa)
  621.                prompt("Processing %c...", ident[cura]);
  622.            else
  623.                prompt("Processing entry %d...", article_id);
  624.   
  625. --- 576,583 -----
  626.            } else
  627.            if (cura >= 0 && cura <= numa)
  628.                prompt("Processing %c...", ident[cura]);
  629. +          else if (ah->subject != NULL)
  630. +              prompt("Processing '%.50s'...", ah->subject);
  631.            else
  632.                prompt("Processing entry %d...", article_id);
  633.   
  634. **************
  635. *** 572,578
  636.        m_endinput();
  637.   
  638.        enable_stop = 1;
  639. !      end_save();
  640.   
  641.        if (did_unshar) {
  642.            any_key(0);
  643. --- 603,610 -----
  644.        m_endinput();
  645.   
  646.        enable_stop = 1;
  647. !      if (cur_k_cmd != K_CANCEL)
  648. !          end_save();
  649.   
  650.        if (did_unshar) {
  651.            printf("\r\n");
  652. **************
  653. *** 575,580
  654.        end_save();
  655.   
  656.        if (did_unshar) {
  657.            any_key(0);
  658.            goto redraw;
  659.        }    
  660. --- 607,613 -----
  661.            end_save();
  662.   
  663.        if (did_unshar) {
  664. +          printf("\r\n");
  665.            any_key(0);
  666.            goto redraw;
  667.        }    
  668. **************
  669. *** 612,618
  670.            goto redraw;
  671.   
  672.        goto Prompt;
  673.         case K_CANCEL:
  674.        if (numa < 0) goto nextmenu;
  675.   
  676. --- 645,651 -----
  677.            goto redraw;
  678.   
  679.        goto Prompt;
  680. ! /*
  681.         case K_CANCEL:
  682.        if (numa < 0) goto nextmenu;
  683.   
  684. **************
  685. *** 632,638
  686.        if (get_k_cmd() == K_ARTICLE_ID)
  687.            if (cancel(articles[firsta+article_id]) & 1) goto redraw;
  688.        goto Prompt;
  689.         case K_UNSUBSCRIBE:
  690.        if (unsubscribe(current_group)) {
  691.            if (!(current_group->group_flag & G_SUBSCRIPTION))
  692. --- 665,671 -----
  693.        if (get_k_cmd() == K_ARTICLE_ID)
  694.            if (cancel(articles[firsta+article_id]) & 1) goto redraw;
  695.        goto Prompt;
  696. ! */
  697.         case K_UNSUBSCRIBE:
  698.        if (unsubscribe(current_group)) {
  699.            if (!(current_group->group_flag & G_SUBSCRIPTION))
  700.  
  701. *** /usr/storm/nn6.3.0/mk_online_man
  702. --- mk_online_man
  703. **************
  704. *** 6,11
  705.       -e '/^\.\\"/d' \
  706.       -e '/^\.nf/d' \
  707.       -e '/^\.fi/d' \
  708.       -e 's/^\.[BI] //' "$@" |
  709.   awk '
  710.   BEGIN {
  711. --- 6,15 -----
  712.       -e '/^\.\\"/d' \
  713.       -e '/^\.nf/d' \
  714.       -e '/^\.fi/d' \
  715. +     -e '/^\.if/d' \
  716. +     -e '/^\.DT/d' \
  717. +     -e '/^\.ta/d' \
  718. +     -e '/^\.nr/d' \
  719.       -e 's/^\.[BI] //' "$@" |
  720.   awk '
  721.   BEGIN {
  722.  
  723. *** /usr/storm/nn6.3.0/more.c
  724. --- more.c
  725. **************
  726. *** 58,64
  727.       register c, col, lno;
  728.       register FILE *art;
  729.       int more_cmd, eof, skip_spaces, has_space, window_lines;
  730. !     int form_feed, ignore_nl;
  731.       off_t firstl, lastl;
  732.       off_t linepos[LINEMAX];
  733.       char linebuf[200], *lp;
  734. --- 58,64 -----
  735.       register c, col, lno;
  736.       register FILE *art;
  737.       int more_cmd, eof, skip_spaces, has_space, window_lines;
  738. !     int form_feed, last_ff_line, ignore_nl;
  739.       off_t firstl, lastl;
  740.       off_t linepos[LINEMAX];
  741.       char linebuf[200], *lp;
  742. **************
  743. *** 141,147
  744.       
  745.       rot13 = 0;
  746.       compress_space = 0;
  747. !     goto_line = -1, prev_goto = 1;
  748.       match_lines = match_redraw = match_expr = 0;
  749.       underline_line = -1;
  750.       fake_underline = 0;
  751. --- 141,147 -----
  752.       
  753.       rot13 = 0;
  754.       compress_space = 0;
  755. !     last_ff_line = goto_line = -1, prev_goto = 1;
  756.       match_lines = match_redraw = match_expr = 0;
  757.       underline_line = -1;
  758.       fake_underline = 0;
  759. **************
  760. *** 398,403
  761.       switch (c) {
  762.   
  763.        case '\f':
  764.           if (lp == linebuf) {
  765.           if (goto_line && lno == lno1) goto next_line;
  766.           form_feed = 1;
  767. --- 398,404 -----
  768.       switch (c) {
  769.   
  770.        case '\f':
  771. +         last_ff_line = linenum;
  772.           if (lp == linebuf) {
  773.           if (goto_line > 0 || match_expr || lno == lno1) goto next_line;
  774.           form_feed = 1;
  775. **************
  776. *** 399,405
  777.   
  778.        case '\f':
  779.           if (lp == linebuf) {
  780. !         if (goto_line && lno == lno1) goto next_line;
  781.           form_feed = 1;
  782.           goto Prompt;
  783.           }
  784. --- 400,406 -----
  785.        case '\f':
  786.           last_ff_line = linenum;
  787.           if (lp == linebuf) {
  788. !         if (goto_line > 0 || match_expr || lno == lno1) goto next_line;
  789.           form_feed = 1;
  790.           goto Prompt;
  791.           }
  792. **************
  793. *** 475,480
  794.       match_lines = 1;
  795.       if (linenum > match_botline) {
  796.           match_redraw = 0;
  797.           linenum -= 5;
  798.           goto next_page;
  799.       } 
  800. --- 476,482 -----
  801.       match_lines = 1;
  802.       if (linenum > match_botline) {
  803.           match_redraw = 0;
  804. +         if (last_ff_line > linenum) last_ff_line = -1;
  805.           linenum -= 5;
  806.           if (linenum < last_ff_line) linenum = last_ff_line;
  807.           goto next_page;
  808. **************
  809. *** 476,481
  810.       if (linenum > match_botline) {
  811.           match_redraw = 0;
  812.           linenum -= 5;
  813.           goto next_page;
  814.       } 
  815.       match_redraw = (stop_line < 0);
  816. --- 478,484 -----
  817.           match_redraw = 0;
  818.           if (last_ff_line > linenum) last_ff_line = -1;
  819.           linenum -= 5;
  820. +         if (linenum < last_ff_line) linenum = last_ff_line;
  821.           goto next_page;
  822.       } 
  823.       match_redraw = (stop_line < 0);
  824. **************
  825. *** 665,670
  826.        case K_PRINT:
  827.        case K_UNSHAR:
  828.        case K_PATCH:
  829.       
  830.       putchar(CR);
  831.       if (init_save(c, (char **)NULL) != NULL) {
  832. --- 668,674 -----
  833.        case K_PRINT:
  834.        case K_UNSHAR:
  835.        case K_PATCH:
  836. +      case K_UUDECODE:
  837.       
  838.       putchar(CR);
  839.       if (init_save(c, (char **)NULL) != NULL) {
  840. **************
  841. *** 695,701
  842.           goto Prompt;
  843.       }
  844.       
  845. !     if (cancel(ah) == 0) goto Prompt;
  846.       more_return(MC_NEXT);
  847.   
  848.        case K_UNSUBSCRIBE:
  849. --- 699,705 -----
  850.           goto Prompt;
  851.       }
  852.       
  853. !     if (cancel(ah) > 0) goto Prompt;
  854.       more_return(MC_NEXT);
  855.   
  856.        case K_UNSUBSCRIBE:
  857.  
  858. *** /usr/storm/nn6.3.0/nn.1
  859. --- nn.1
  860. **************
  861. *** 768,773
  862.   article through the patch command. 
  863.     The output from the patch process will be piped through the pager
  864.   defined in the \fBpager\fP variable and appear on the screen.
  865.   .TP
  866.   \&\fB:unshar\fP    {\fBunshar\fP}
  867.   Unshar articles.  You will be prompted for the name of a directory in
  868. --- 768,775 -----
  869.   article through the patch command. 
  870.     The output from the patch process will be piped through the pager
  871.   defined in the \fBpager\fP variable and appear on the screen.
  872. +   The output is also saved in (or appended to) a file named
  873. + \fIPatch.Result\fP in the patch directory. 
  874.   .TP
  875.   \&\fB:unshar\fP    {\fBunshar\fP}
  876.   Unshar articles.  You will be prompted for the name of a directory in
  877. **************
  878. *** 777,782
  879.     During the unpacking, the normal output from the unshar process will
  880.   appear on the screen, and the menu or article text will be redrawn when
  881.   the process is finished.
  882.   .LP
  883.   In reading mode, the following keys can also be used to invoke the
  884.   save commands:
  885. --- 779,802 -----
  886.     During the unpacking, the normal output from the unshar process will
  887.   appear on the screen, and the menu or article text will be redrawn when
  888.   the process is finished.
  889. +   The output is also saved in (or appended to) a file named
  890. + \fIUnshar.Result\fP in the unshar directory. 
  891. + .TP
  892. + \&\fB:decode\fP    {\fBdecode\fP}
  893. + Decode \fIuuencoded\fP articles into binary files.  You will be
  894. + prompted for the name of a directory in which you want \fInn\fP to
  895. + place the decoded binary files (the file names are taken from the
  896. + uuencoded data).
  897. +   \fInn\fP will combine several articles into single files as needed,
  898. + and you can even decode unrelated packages (into the same directory)
  899. + with one \fBdecode\fP command.
  900. +   To be able to decode a binary file which spans several articles,
  901. + \fInn\fP may have to \fIignore\fP lines which fail the normal sanity checks 
  902. + on uuencoded data instead of treating them as \fItransmission errors\fP.
  903. + Consequently, it is strongly recommended to check the resulting
  904. + decoded file using the checksum which is normally contained in the
  905. + original article.  (Actually, you are also supposed to do this after
  906. + decoding with a stand-alone uudecode program).
  907.   .LP
  908.   In reading mode, the following keys can also be used to invoke the
  909.   save commands:
  910. **************
  911. *** 1546,1553
  912.   in the order in which they arrived on the local system (which is a
  913.   completely arbitrary order).
  914.   .TP
  915. ! \fB:unread\fP [ \fIarticles\fP ]
  916. ! Mark the current group as unread.  If the argument is omitted, the
  917.   number of unread articles in the group will be set to the number of
  918.   unread articles when \fInn\fP was invoked.  Otherwise, the argument
  919.   specifies the number of unread articles.
  920. --- 1566,1574 -----
  921.   in the order in which they arrived on the local system (which is a
  922.   completely arbitrary order).
  923.   .TP
  924. ! \fB:unread\fP [ \fIgroup\fP ] [ \fIarticles\fP ]
  925. ! Mark the current (or specified) group as unread.  If the
  926. ! \fIarticles\fP argument is omitted, the
  927.   number of unread articles in the group will be set to the number of
  928.   unread articles when \fInn\fP was invoked.  Otherwise, the argument
  929.   specifies the number of unread articles.
  930.  
  931. *** /usr/storm/nn6.3.0/nngrep.sh
  932. --- nngrep.sh
  933. **************
  934. *** 8,13
  935.   if [ "$1" = "-a" ] ; then
  936.       grep "$2" .nn/rc
  937.   else
  938. !     grep "^+ .* .*$1" .nn/rc
  939.   fi |
  940.   awk '{print $3}'
  941. --- 8,13 -----
  942.   if [ "$1" = "-a" ] ; then
  943.       grep "$2" .nn/rc
  944.   else
  945. !     grep "^[+=] .* .*$1" .nn/rc
  946.   fi |
  947.   awk '{print $3}'
  948.  
  949. *** /usr/storm/nn6.3.0/nntidy.sh
  950. --- nntidy.sh
  951. **************
  952. *** 35,41
  953.       if (act) { 
  954.           X[$1] = 1
  955.           L[$1] = $2+0 
  956. !         if (L[$1] == 0) F[$1] = 0; else F[$1] = $3+0
  957.       }
  958.       next
  959.   }
  960. --- 35,41 -----
  961.       if (act) { 
  962.           X[$1] = 1
  963.           L[$1] = $2+0 
  964. !         if (L[$1] == 0 || $3+0 == 0) F[$1] = 0; else F[$1] = $3-1
  965.       }
  966.       next
  967.   }
  968. **************
  969. *** 43,49
  970.       print $0
  971.       next
  972.   }
  973. ! NF == 3 && ($1 == "!" || $1 == "+") {
  974.       if (X[$3] != 1) next
  975.       S[$3] = $1
  976.       if (L[$3] >= $2+0)
  977. --- 43,49 -----
  978.       print $0
  979.       next
  980.   }
  981. ! NF == 3 && ($1 == "!" || $1 == "+" || $1 == "=") {
  982.       if (X[$3] != 1) next
  983.       S[$3] = $1
  984.       if (L[$3] >= $2+0)
  985.  
  986. *** /usr/storm/nn6.3.0/nntp.c
  987. --- nntp.c
  988. **************
  989. *** 32,38
  990.   #include <netdb.h>
  991.   
  992.   /* This is necessary due to the definitions in m-XXX.h */
  993. ! #ifdef NETWORK_BYTE_ORDER
  994.   #include <netinet/in.h>
  995.   #endif
  996.   
  997. --- 32,38 -----
  998.   #include <netdb.h>
  999.   
  1000.   /* This is necessary due to the definitions in m-XXX.h */
  1001. ! #ifndef NETWORK_DATABASE
  1002.   #include <netinet/in.h>
  1003.   #else
  1004.   #ifdef NETWORK_BYTE_ORDER
  1005. **************
  1006. *** 34,39
  1007.   /* This is necessary due to the definitions in m-XXX.h */
  1008.   #ifdef NETWORK_BYTE_ORDER
  1009.   #include <netinet/in.h>
  1010.   #endif
  1011.   
  1012.   export char nntp_server[256];    /* name of nntp server */
  1013. --- 34,42 -----
  1014.   /* This is necessary due to the definitions in m-XXX.h */
  1015.   #ifndef NETWORK_DATABASE
  1016.   #include <netinet/in.h>
  1017. + #else
  1018. + #ifdef NETWORK_BYTE_ORDER
  1019. + #include <netinet/in.h>
  1020.   #endif
  1021.   #endif
  1022.   
  1023. **************
  1024. *** 35,40
  1025.   #ifdef NETWORK_BYTE_ORDER
  1026.   #include <netinet/in.h>
  1027.   #endif
  1028.   
  1029.   export char nntp_server[256];    /* name of nntp server */
  1030.   export int use_nntp = 0;    /* bool: t iff we use nntp */
  1031. --- 38,44 -----
  1032.   #ifdef NETWORK_BYTE_ORDER
  1033.   #include <netinet/in.h>
  1034.   #endif
  1035. + #endif
  1036.   
  1037.   export char nntp_server[256];    /* name of nntp server */
  1038.   export int use_nntp = 0;    /* bool: t iff we use nntp */
  1039. **************
  1040. *** 150,155
  1041.       fl;
  1042.       }
  1043.       nntp_failed = 1;
  1044.   
  1045.       sockt_rd = nntp_get_socket();
  1046.       if ((nntp_in = fdopen(sockt_rd, "r")) == NULL)
  1047. --- 154,160 -----
  1048.       fl;
  1049.       }
  1050.       nntp_failed = 1;
  1051. +     is_connected = 0;
  1052.   
  1053.       sockt_rd = nntp_get_socket();
  1054.       if (sockt_rd < 0)
  1055. **************
  1056. *** 152,158
  1057.       nntp_failed = 1;
  1058.   
  1059.       sockt_rd = nntp_get_socket();
  1060. !     if ((nntp_in = fdopen(sockt_rd, "r")) == NULL)
  1061.           return -1;
  1062.    
  1063.       sockt_wr = dup(sockt_rd);
  1064. --- 157,167 -----
  1065.       is_connected = 0;
  1066.   
  1067.       sockt_rd = nntp_get_socket();
  1068. !     if (sockt_rd < 0)
  1069. !       return -1;
  1070. !     if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) {
  1071. !     close(sockt_rd);
  1072.           return -1;
  1073.       }
  1074.       sockt_wr = dup(sockt_rd);
  1075. **************
  1076. *** 154,160
  1077.       sockt_rd = nntp_get_socket();
  1078.       if ((nntp_in = fdopen(sockt_rd, "r")) == NULL)
  1079.           return -1;
  1080. !  
  1081.       sockt_wr = dup(sockt_rd);
  1082.       if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) {
  1083.           nntp_in = NULL;               /* from above */
  1084. --- 163,169 -----
  1085.       if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) {
  1086.       close(sockt_rd);
  1087.           return -1;
  1088. !     }
  1089.       sockt_wr = dup(sockt_rd);
  1090.       if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) {
  1091.       close(sockt_wr);
  1092. **************
  1093. *** 157,162
  1094.    
  1095.       sockt_wr = dup(sockt_rd);
  1096.       if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) {
  1097.           nntp_in = NULL;               /* from above */
  1098.           return -1;
  1099.       }
  1100. --- 166,173 -----
  1101.       }
  1102.       sockt_wr = dup(sockt_rd);
  1103.       if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) {
  1104. +     close(sockt_wr);
  1105. +     fclose(nntp_in);
  1106.           nntp_in = NULL;               /* from above */
  1107.           return -1;
  1108.       }
  1109. **************
  1110. *** 228,233
  1111.       if (!is_master)
  1112.           msg("Connecting to %s: %s", nntp_server, syserr());
  1113.       (void) close(s);
  1114.       }
  1115.       if (x < 0 && !is_master)
  1116.       (*errfct)("Giving up on NNTP server %s!\n", nntp_server);
  1117. --- 239,245 -----
  1118.       if (!is_master)
  1119.           msg("Connecting to %s: %s", nntp_server, syserr());
  1120.       (void) close(s);
  1121. +     s = -1;
  1122.       }
  1123.       if (x < 0 && !is_master)
  1124.       (*errfct)("Giving up on NNTP server %s!\n", nntp_server);
  1125. **************
  1126. *** 240,245
  1127.       if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
  1128.       if (is_master)
  1129.           (*errfct)("Connecting to %s: %s", nntp_server, syserr());
  1130.       }
  1131.       
  1132.   #endif
  1133. --- 252,258 -----
  1134.       if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
  1135.       if (is_master)
  1136.           (*errfct)("Connecting to %s: %s", nntp_server, syserr());
  1137. +     s = -1;
  1138.       }
  1139.       
  1140.   #endif
  1141. **************
  1142. *** 261,266
  1143.       fprintf(nntp_out, "%s\r\n", string);
  1144.       if (fflush(nntp_out) == EOF) {
  1145.       nntp_error();
  1146.       }
  1147.   }
  1148.   
  1149. --- 274,280 -----
  1150.       fprintf(nntp_out, "%s\r\n", string);
  1151.       if (fflush(nntp_out) == EOF) {
  1152.       nntp_error();
  1153. +     return -1;
  1154.       }
  1155.       return 0;
  1156.   }
  1157. **************
  1158. *** 262,267
  1159.       if (fflush(nntp_out) == EOF) {
  1160.       nntp_error();
  1161.       }
  1162.   }
  1163.   
  1164.   /* 
  1165. --- 276,282 -----
  1166.       nntp_error();
  1167.       return -1;
  1168.       }
  1169. +     return 0;
  1170.   }
  1171.   
  1172.   /* 
  1173. **************
  1174. *** 277,283
  1175.   {
  1176.       register char *cp, *nl;
  1177.   
  1178. -     errno = 0;
  1179.       if (fgets(string, size, nntp_in) == NULL) {
  1180.       nntp_error();
  1181.       return -1;
  1182. --- 292,297 -----
  1183.   {
  1184.       register char *cp, *nl;
  1185.   
  1186.       if (fgets(string, size, nntp_in) == NULL) {
  1187.       nntp_error();
  1188.       return -1;
  1189. **************
  1190. *** 323,329
  1191.       if (!nntp_failed) {            /* avoid infinite recursion */
  1192.       char line[NNTP_STRLEN];
  1193.   
  1194. !     nntp_put_server("QUIT");
  1195.       (void) nntp_get_server(line, sizeof line);
  1196.       }
  1197.   
  1198. --- 337,343 -----
  1199.       if (!nntp_failed) {            /* avoid infinite recursion */
  1200.       char line[NNTP_STRLEN];
  1201.   
  1202. !     (void) nntp_put_server("QUIT");
  1203.       (void) nntp_get_server(line, sizeof line);
  1204.       }
  1205.   
  1206. **************
  1207. *** 344,352
  1208.   char *string;
  1209.   int size;
  1210.   {
  1211. !     (void)nntp_put_server(string);
  1212. !     if (nntp_get_server(string, size) < 0)
  1213.       return -1;
  1214.   #ifdef DEBUG
  1215.       msg("<<< %.75s", string);
  1216. --- 358,364 -----
  1217.   char *string;
  1218.   int size;
  1219.   {
  1220. !     if (nntp_put_server(string) < 0 || nntp_get_server(string, size) < 0)
  1221.       return -1;
  1222.   #ifdef DEBUG
  1223.       msg("<<< %.75s", string);
  1224. **************
  1225. *** 367,374
  1226.   {
  1227.       nntp_failed = 1;
  1228.       if (is_master) {
  1229. !     log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr());
  1230. !     if (is_connected)
  1231.           nntp_close_server();
  1232.       } else {
  1233.   #ifdef DEBUG
  1234. --- 379,386 -----
  1235.   {
  1236.       nntp_failed = 1;
  1237.       if (is_master) {
  1238. !     if (is_connected) {
  1239. !         log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr());
  1240.           nntp_close_server();
  1241.       }
  1242.       } else {
  1243. **************
  1244. *** 370,375
  1245.       log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr());
  1246.       if (is_connected)
  1247.           nntp_close_server();
  1248.       } else {
  1249.   #ifdef DEBUG
  1250.       printf("Can't talk to NNTP server %s: %s", nntp_server, syserr());
  1251. --- 382,388 -----
  1252.       if (is_connected) {
  1253.           log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr());
  1254.           nntp_close_server();
  1255. +     }
  1256.       } else {
  1257.   #ifdef DEBUG
  1258.       printf("Can't talk to NNTP server %s: %s", nntp_server, syserr());
  1259.  
  1260. *** /usr/storm/nn6.3.0/nnusage.sh
  1261. --- nnusage.sh
  1262. **************
  1263. *** 8,16
  1264.   
  1265.   grep '^U:' $LIB/Log |
  1266.   
  1267. ! awk ' 
  1268. ! NF == 7 { 
  1269. !     if (split($7, t, ".") == 2) u[$5] += t[1] * 60 + t[2]
  1270.   }
  1271.   END {
  1272.       for (n in u) {
  1273. --- 8,16 -----
  1274.   
  1275.   grep '^U:' $LIB/Log |
  1276.   
  1277. ! awk '
  1278. ! BEGIN {
  1279. !     any=0
  1280.   }
  1281.   NF == 7 { 
  1282.       if (split($7, t, ".") == 2) { 
  1283. **************
  1284. *** 12,17
  1285.   NF == 7 { 
  1286.       if (split($7, t, ".") == 2) u[$5] += t[1] * 60 + t[2]
  1287.   }
  1288.   END {
  1289.       for (n in u) {
  1290.           name=substr(n, 2, length(n)-3)
  1291. --- 12,23 -----
  1292.   BEGIN {
  1293.       any=0
  1294.   }
  1295. + NF == 7 { 
  1296. +     if (split($7, t, ".") == 2) { 
  1297. +         u[$5] += t[1] * 60 + t[2]
  1298. +         any=1
  1299. +     }
  1300. + }
  1301.   END {
  1302.       if (!any) {
  1303.           printf("No usage statistics\n")
  1304. **************
  1305. *** 13,18
  1306.       if (split($7, t, ".") == 2) u[$5] += t[1] * 60 + t[2]
  1307.   }
  1308.   END {
  1309.       for (n in u) {
  1310.           name=substr(n, 2, length(n)-3)
  1311.           printf("%s%16d.%02d\n", name, u[n]/60, u[n]%60);
  1312. --- 19,28 -----
  1313.       }
  1314.   }
  1315.   END {
  1316. +     if (!any) {
  1317. +         printf("No usage statistics\n")
  1318. +         exit
  1319. +     }
  1320.       for (n in u) {
  1321.           name=substr(n, 2, length(n)-3)
  1322.           printf("%-10.10s%8d.%02d\n", name, u[n]/60, u[n]%60);
  1323. **************
  1324. *** 15,21
  1325.   END {
  1326.       for (n in u) {
  1327.           name=substr(n, 2, length(n)-3)
  1328. !         printf("%s%16d.%02d\n", name, u[n]/60, u[n]%60);
  1329.       }
  1330.   }' |
  1331.   
  1332. --- 25,31 -----
  1333.       }
  1334.       for (n in u) {
  1335.           name=substr(n, 2, length(n)-3)
  1336. !         printf("%-10.10s%8d.%02d\n", name, u[n]/60, u[n]%60);
  1337.       }
  1338.   }' |
  1339.   
  1340.  
  1341. *** /usr/storm/nn6.3.0/prefix.sh
  1342. --- prefix.sh
  1343. **************
  1344. *** 5,10
  1345.   #include "update.h"
  1346.   
  1347.   --------CUT PREFIX HERE--------
  1348.   &!/bin/sh
  1349.   
  1350.   & Release RELEASE,VERSION,PATCHLEVEL, No. UPDATE
  1351. --- 5,11 -----
  1352.   #include "update.h"
  1353.   
  1354.   --------CUT PREFIX HERE--------
  1355. + #ifndef AVOID_SHELL_EXEC
  1356.   &!/bin/sh
  1357.   #endif
  1358.   
  1359. **************
  1360. *** 6,11
  1361.   
  1362.   --------CUT PREFIX HERE--------
  1363.   &!/bin/sh
  1364.   
  1365.   & Release RELEASE,VERSION,PATCHLEVEL, No. UPDATE
  1366.   
  1367. --- 7,13 -----
  1368.   --------CUT PREFIX HERE--------
  1369.   #ifndef AVOID_SHELL_EXEC
  1370.   &!/bin/sh
  1371. + #endif
  1372.   
  1373.   & Release RELEASE,VERSION,PATCHLEVEL, No. UPDATE
  1374.   
  1375.  
  1376. *** /usr/storm/nn6.3.1/rc.c
  1377. --- rc.c
  1378. **************
  1379. *** 45,51
  1380.    * master file has been read in
  1381.    */
  1382.   
  1383. ! #define    G_OLD    G_NEW    /* inverse use during rc reading */
  1384.   #define G_RENUM    G_DONE
  1385.   
  1386.   
  1387. --- 45,51 -----
  1388.    * master file has been read in
  1389.    */
  1390.   
  1391. ! #define    G_OLD    G_SELECTION
  1392.   #define G_RENUM    G_DONE
  1393.   
  1394.   
  1395. **************
  1396. *** 166,172
  1397.           fputc(NL, bak);
  1398.       }
  1399.       
  1400. !     if (SUBSCR(line) != '+' && SUBSCR(line) != '!') {
  1401.           /* unrecognized line */
  1402.           continue;
  1403.       }
  1404. --- 166,172 -----
  1405.           fputc(NL, bak);
  1406.       }
  1407.       
  1408. !     if (SUBSCR(line) != '+' && SUBSCR(line) != '!' && SUBSCR(line) != '=') {
  1409.           /* unrecognized line */
  1410.           continue;
  1411.       }
  1412. **************
  1413. *** 182,188
  1414.       gh->group_flag |= G_OLD;
  1415.       if (SUBSCR(line) == '+')
  1416.           gh->group_flag |= G_SUBSCRIPTION;
  1417. !     
  1418.       gh->last_article = LASTART(line);
  1419.       
  1420.       if (gh->last_article > gh->last_l_article)
  1421. --- 182,190 -----
  1422.       gh->group_flag |= G_OLD;
  1423.       if (SUBSCR(line) == '+')
  1424.           gh->group_flag |= G_SUBSCRIPTION;
  1425. !     if (SUBSCR(line) == '=')
  1426. !         gh->group_flag |= G_SUBSCRIPTION | G_NEW;
  1427.       gh->last_article = LASTART(line);
  1428.       
  1429.       if (gh->last_article > gh->last_l_article)
  1430. **************
  1431. *** 207,213
  1432.       if (gh->group_flag & G_OLD) {
  1433.           if (gh->group_flag & G_RENUM) /* group is renumbered */
  1434.           write_rc_entry(gh, 0);
  1435. !         gh->group_flag &= ~(G_NEW | G_RENUM);
  1436.       } else {
  1437.           gh->group_flag |= G_SUBSCRIPTION | G_NEW;
  1438.           gh->last_article = gh->first_l_article - 1;
  1439. --- 209,215 -----
  1440.       if (gh->group_flag & G_OLD) {
  1441.           if (gh->group_flag & G_RENUM) /* group is renumbered */
  1442.           write_rc_entry(gh, 0);
  1443. !         gh->group_flag &= ~(G_OLD | G_RENUM);
  1444.       } else {
  1445.           gh->group_flag |= G_SUBSCRIPTION | G_NEW;
  1446.           gh->last_article = gh->first_l_article - 1;
  1447. **************
  1448. *** 272,278
  1449.   {
  1450.       add_unread(gh, -1);
  1451.   
  1452. !     if (no_update || gh->group_flag & G_RC_UPDATED) return;
  1453.   
  1454.       gh->last_article = gh->last_l_article;
  1455.   
  1456. --- 274,280 -----
  1457.   {
  1458.       add_unread(gh, -1);
  1459.   
  1460. !     if (no_update || gh->group_flag & G_READ) return;
  1461.   
  1462.       gh->last_article = gh->last_l_article;
  1463.   
  1464. **************
  1465. *** 284,291
  1466.   
  1467.       write_rc_entry(gh, 0);
  1468.       
  1469. -     if (gh->group_flag & G_READ) return;
  1470. -     
  1471.       gh->group_flag |= G_READ;
  1472.   
  1473.       if ((gh->group_flag & G_SUBSCRIPTION) == 0) return;
  1474. --- 286,291 -----
  1475.   
  1476.       write_rc_entry(gh, 0);
  1477.       
  1478.       gh->group_flag |= G_READ;
  1479.   }
  1480.   
  1481. **************
  1482. *** 287,294
  1483.       if (gh->group_flag & G_READ) return;
  1484.       
  1485.       gh->group_flag |= G_READ;
  1486. -     if ((gh->group_flag & G_SUBSCRIPTION) == 0) return;
  1487.   }
  1488.   
  1489.   
  1490. --- 287,292 -----
  1491.       write_rc_entry(gh, 0);
  1492.       
  1493.       gh->group_flag |= G_READ;
  1494.   }
  1495.   
  1496.   
  1497. **************
  1498. *** 296,302
  1499.   register group_header *gh;
  1500.   long count;
  1501.   {
  1502. !     if (no_update || (count == 0 && (gh->group_flag & G_RC_UPDATED) == 0))
  1503.       return 0;
  1504.   
  1505.       if (gh->group_flag & G_READ || count > 0) {
  1506. --- 294,300 -----
  1507.   register group_header *gh;
  1508.   long count;
  1509.   {
  1510. !     if (no_update || (count == 0 && (gh->group_flag & G_READ) == 0))
  1511.       return 0;
  1512.   
  1513.       if (gh->group_flag & G_READ || count > 0) {
  1514. **************
  1515. *** 318,324
  1516.   
  1517.       write_rc_entry(gh, 0);
  1518.       
  1519. !     gh->group_flag &= ~(G_READ|G_RC_UPDATED);
  1520.       
  1521.       add_unread(gh, 1);
  1522.       
  1523. --- 316,322 -----
  1524.   
  1525.       write_rc_entry(gh, 0);
  1526.       
  1527. !     gh->group_flag &= ~G_READ;
  1528.       
  1529.       add_unread(gh, 1);
  1530.       
  1531. **************
  1532. *** 469,474
  1533.       /* update article number */
  1534.       
  1535.       fprintf(rc, "%c %06ld",    /* MUST CHANGE IF LASTARTZ CHANGES */
  1536.           (gh->group_flag & G_SUBSCRIPTION) ? '+' : '!',
  1537.           (long)(gh->last_article));
  1538.   
  1539. --- 467,473 -----
  1540.       /* update article number */
  1541.       
  1542.       fprintf(rc, "%c %06ld",    /* MUST CHANGE IF LASTARTZ CHANGES */
  1543. +         (gh->group_flag & G_NEW) ? '=' :
  1544.           (gh->group_flag & G_SUBSCRIPTION) ? '+' : '!',
  1545.           (long)(gh->last_article));
  1546.   
  1547. **************
  1548. *** 570,578
  1549.           
  1550.           /* Notice: unread articles before the last read article are lost */
  1551.           
  1552. -         if (*sub == NL)    /* new group */
  1553. -         continue;
  1554. -         
  1555.           if (subscr) {
  1556.           last = strrchr(sub, '-');
  1557.           if (last == NULL) last = strrchr(sub, ',');
  1558. --- 569,574 -----
  1559.           
  1560.           /* Notice: unread articles before the last read article are lost */
  1561.           
  1562.           if (subscr) {
  1563.           if (*sub == NL) continue; /* new group */
  1564.           
  1565. **************
  1566. *** 574,579
  1567.           continue;
  1568.           
  1569.           if (subscr) {
  1570.           last = strrchr(sub, '-');
  1571.           if (last == NULL) last = strrchr(sub, ',');
  1572.           if (last == NULL) last = strrchr(sub, ' ');
  1573. --- 570,577 -----
  1574.           /* Notice: unread articles before the last read article are lost */
  1575.           
  1576.           if (subscr) {
  1577. +         if (*sub == NL) continue; /* new group */
  1578. +         
  1579.           last = strrchr(sub, '-');
  1580.           if (last == NULL) last = strrchr(sub, ',');
  1581.           if (last == NULL) last = strrchr(sub, ' ');
  1582.  
  1583. *** /usr/storm/nn6.3.0/s-template.h
  1584. --- s-template.h
  1585. **************
  1586. *** 128,133
  1587.   #define SHELL        "/bin/sh"
  1588.   
  1589.   /*
  1590.    *    Specify the default mailer to be invoked by nnmail
  1591.    */
  1592.   
  1593. --- 128,142 -----
  1594.   #define SHELL        "/bin/sh"
  1595.   
  1596.   /*
  1597. +  *    Define AVOID_SHELL_EXEC if the system gets confused by
  1598. +  *        #!/bin/sh
  1599. +  *    lines in shell scripts, e.g. only reads #! and thinks it
  1600. +  *    is a csh script.
  1601. +  */
  1602. + /* #define AVOID_SHELL_EXEC        /* */
  1603. + /*
  1604.    *    Specify the default mailer to be invoked by nnmail
  1605.    */
  1606.   
  1607.  
  1608. *** /usr/storm/nn6.3.0/save.c
  1609. --- save.c
  1610. **************
  1611. *** 44,49
  1612.   #define    IS_PIPE        0x1000    /* output is on pipe */
  1613.   #define    DO_UNSHAR    0x2000    /* unshar article (or patch) */
  1614.   #define    DO_PATCH    0x4000    /* patch article */
  1615.   
  1616.   /* open modes for open_news_article for the various HEADER_HANDLINGs */
  1617.   
  1618. --- 44,50 -----
  1619.   #define    IS_PIPE        0x1000    /* output is on pipe */
  1620.   #define    DO_UNSHAR    0x2000    /* unshar article (or patch) */
  1621.   #define    DO_PATCH    0x4000    /* patch article */
  1622. + #define    DO_DECODE    0x8000    /* uudecode article */
  1623.   
  1624.   /* open modes for open_news_article for the various HEADER_HANDLINGs */
  1625.   
  1626. **************
  1627. *** 144,149
  1628.       }
  1629.       break;
  1630.   
  1631.        case K_PATCH:
  1632.       save_mode = NO_HEADER | SEPARATE_FILES | DO_UNSHAR | DO_PATCH;
  1633.       mode_text = "Patch";
  1634. --- 145,155 -----
  1635.       }
  1636.       break;
  1637.   
  1638. +      case K_UUDECODE:
  1639. +     save_mode = NO_HEADER | DO_UNSHAR | DO_DECODE;
  1640. +     mode_text = "Decode";
  1641. +     goto patch1;
  1642. +     
  1643.        case K_PATCH:
  1644.       save_mode = NO_HEADER | SEPARATE_FILES | DO_UNSHAR | DO_PATCH;
  1645.       mode_text = "Patch";
  1646. **************
  1647. *** 157,170
  1648.       
  1649.        patch1:
  1650.       prompt("\1%s Directory:\1 ", mode_text);
  1651. !     save_name = get_s(last_dir, NONE, NONE, file_completion);
  1652. !     if (save_name == NULL) return NULL;
  1653. !     if (*save_name == NUL) 
  1654. !         save_name = NULL;
  1655. !     else {
  1656. !         strcpy(last_dir, save_name);
  1657. !     }
  1658. !     
  1659.       break;
  1660.       
  1661.        case K_PRINT:
  1662. --- 163,171 -----
  1663.       
  1664.        patch1:
  1665.       prompt("\1%s Directory:\1 ", mode_text);
  1666. !     save_name = get_s(last_dir, current_group->save_file, NONE, file_completion);
  1667. !     if (save_name == NULL || *save_name == NUL) return NULL;
  1668. !     strcpy(last_dir, save_name);
  1669.       break;
  1670.       
  1671.        case K_PRINT:
  1672. **************
  1673. *** 198,204
  1674.       
  1675.       if (!(save_mode & IS_PIPE)) {
  1676.           if (file_exist(save_name, (save_mode & DO_UNSHAR) ? "wd" : "wf")) {
  1677. !         if (conf_append && (save_mode & DO_UNSHAR) == 0) {
  1678.               printf("\rAppend to: %s ? ", save_name);
  1679.               clrline();
  1680.               if (!yes(0)) return NULL;
  1681. --- 199,210 -----
  1682.       
  1683.       if (!(save_mode & IS_PIPE)) {
  1684.           if (file_exist(save_name, (save_mode & DO_UNSHAR) ? "wd" : "wf")) {
  1685. !         if (save_mode & DO_UNSHAR) {
  1686. !             int len = strlen(save_name);
  1687. !             if (save_name[len - 1] != '/')
  1688. !             strcpy(save_name + len, "/");
  1689. !         } else
  1690. !         if (conf_append) {
  1691.               printf("\rAppend to: %s ? ", save_name);
  1692.               clrline();
  1693.               if (!yes(0)) return NULL;
  1694. **************
  1695. *** 210,216
  1696.           }
  1697.   
  1698.           if (save_mode & DO_UNSHAR) {
  1699. !             strcat(save_name, "/");
  1700.           }
  1701.   
  1702.           start = ckdir_path(save_name);
  1703. --- 216,224 -----
  1704.           }
  1705.   
  1706.           if (save_mode & DO_UNSHAR) {
  1707. !             int len = strlen(save_name);
  1708. !             if (save_name[len - 1] != '/')
  1709. !             strcpy(save_name + len, "/");
  1710.           }
  1711.   
  1712.           start = ckdir_path(save_name);
  1713. **************
  1714. *** 244,249
  1715.   
  1716.       save_mode |= FILE_IS_NEW;    /* so save() will open it */
  1717.   
  1718.   #ifdef PAGED_OUTPUT
  1719.       if (save_mode & DO_UNSHAR) {
  1720.       int was_raw = no_raw();
  1721. --- 252,262 -----
  1722.   
  1723.       save_mode |= FILE_IS_NEW;    /* so save() will open it */
  1724.   
  1725. +     if (save_mode & DO_DECODE) {
  1726. +     uud_start(save_name);
  1727. +     save_mode &= ~DO_UNSHAR;
  1728. +     }
  1729. +     
  1730.   #ifdef PAGED_OUTPUT
  1731.       if (save_mode & DO_UNSHAR) {
  1732.       int was_raw = no_raw();
  1733. **************
  1734. *** 258,264
  1735.       system("fdcheck");
  1736.       }
  1737.   #endif
  1738. !     
  1739.       return save_name;
  1740.   }
  1741.   
  1742. --- 271,277 -----
  1743.       system("fdcheck");
  1744.       }
  1745.   #endif
  1746.       return save_name;
  1747.   }
  1748.   
  1749. **************
  1750. *** 284,289
  1751.       return 0;
  1752.       }
  1753.   
  1754.       if (save_mode & UNIQUE_FILES) {
  1755.       do {
  1756.           uniq_counter++;
  1757. --- 297,309 -----
  1758.       return 0;
  1759.       }
  1760.   
  1761. +     if (save_mode & DO_DECODE) {
  1762. +     save_file = NULL;
  1763. +     c = uudecode(ah, art);
  1764. +     fclose(art);
  1765. +     return (c < 0) ? 0 : 1;
  1766. +     }
  1767. +     
  1768.       if (save_mode & UNIQUE_FILES) {
  1769.       do {
  1770.           uniq_counter++;
  1771. **************
  1772. *** 317,323
  1773.           sprintf(copybuf, "%s %s", unshar_cmd, pager_redir);
  1774.   #else
  1775.           sprintf(copybuf, 
  1776. !             "cd %s && %s | tee %s 2>&1 ; cat %s >> %s.Result ; rm %s",
  1777.               save_name != NULL ? save_name : ".", unshar_cmd,
  1778.               temp_file, temp_file, 
  1779.               (save_mode & DO_PATCH) ? "Patch" : "Unshar",
  1780. --- 337,343 -----
  1781.           sprintf(copybuf, "%s %s", unshar_cmd, pager_redir);
  1782.   #else
  1783.           sprintf(copybuf, 
  1784. !             "cd %s && { %s 2>&1 ; } | tee %s ; cat %s >> %s.Result ; rm %s",
  1785.               save_name != NULL ? save_name : ".", unshar_cmd,
  1786.               temp_file, temp_file, 
  1787.               (save_mode & DO_PATCH) ? "Patch" : "Unshar",
  1788. **************
  1789. *** 450,455
  1790.       save_file = NULL;
  1791.       }
  1792.       
  1793.   #ifdef PAGED_OUTPUT
  1794.       if (pager_stream != NULL) {
  1795.       pclose(pager_stream);
  1796. --- 470,478 -----
  1797.       save_file = NULL;
  1798.       }
  1799.       
  1800. +     if (save_mode & DO_DECODE) {
  1801. +     uud_end();
  1802. +     }
  1803.   #ifdef PAGED_OUTPUT
  1804.       if (pager_stream != NULL) {
  1805.       pclose(pager_stream);
  1806.  
  1807. *** /usr/storm/nn6.3.0/selection.c
  1808. --- selection.c
  1809. **************
  1810. *** 17,22
  1811.   } header;
  1812.   
  1813.   #ifndef NETWORK_DATABASE
  1814.   #undef ntohl
  1815.   #undef htonl
  1816.   #undef NETWORK_BYTE_ORDER
  1817. --- 17,27 -----
  1818.   } header;
  1819.   
  1820.   #ifndef NETWORK_DATABASE
  1821. + #undef NETWORK_BYTE_ORDER
  1822. + #define NETWORK_BYTE_ORDER
  1823. + #endif
  1824. + #ifdef NETWORK_BYTE_ORDER
  1825.   #undef ntohl
  1826.   #undef htonl
  1827.   #define ntohl(x) (x)
  1828. **************
  1829. *** 19,25
  1830.   #ifndef NETWORK_DATABASE
  1831.   #undef ntohl
  1832.   #undef htonl
  1833. - #undef NETWORK_BYTE_ORDER
  1834.   #define ntohl(x) (x)
  1835.   #define htonl(x) (x)
  1836.   #define NETWORK_BYTE_ORDER
  1837. --- 24,29 -----
  1838.   #ifdef NETWORK_BYTE_ORDER
  1839.   #undef ntohl
  1840.   #undef htonl
  1841.   #define ntohl(x) (x)
  1842.   #define htonl(x) (x)
  1843.   #endif
  1844. **************
  1845. *** 22,28
  1846.   #undef NETWORK_BYTE_ORDER
  1847.   #define ntohl(x) (x)
  1848.   #define htonl(x) (x)
  1849. - #define NETWORK_BYTE_ORDER
  1850.   #endif
  1851.   
  1852.   struct sel_art {
  1853. --- 26,31 -----
  1854.   #undef htonl
  1855.   #define ntohl(x) (x)
  1856.   #define htonl(x) (x)
  1857.   #endif
  1858.   
  1859.   struct sel_art {
  1860.  
  1861. *** /usr/storm/nn6.3.0/sequence.c
  1862. --- sequence.c
  1863. **************
  1864. *** 175,181
  1865.       if (st.st_size == 0 || st.st_mtime < st.st_atime) return;
  1866.       
  1867.       mail_group.group_name = read_mail;
  1868. !     gh->group_flag = G_FOLDER | G_MAILBOX | G_RC_UPDATED | G_READ;
  1869.   
  1870.       /* "invent" an unread article for read_news */
  1871.       gh->last_article = 1;
  1872. --- 175,181 -----
  1873.       if (st.st_size == 0 || st.st_mtime < st.st_atime) return;
  1874.       
  1875.       mail_group.group_name = read_mail;
  1876. !     gh->group_flag = G_FOLDER | G_MAILBOX | G_READ;
  1877.   
  1878.       /* "invent" an unread article for read_news */
  1879.       gh->last_article = 1;
  1880. **************
  1881. *** 367,373
  1882.       mem_check(gh, 1, "group header");
  1883.       
  1884.       gh->group_name = name;
  1885. !     gh->group_flag = flag | G_RC_UPDATED | G_READ;
  1886.   
  1887.       /* "invent" an unread article for read_news */
  1888.       gh->last_article = 1;
  1889. --- 367,373 -----
  1890.       mem_check(gh, 1, "group header");
  1891.       
  1892.       gh->group_name = name;
  1893. !     gh->group_flag = flag | G_READ;
  1894.   
  1895.       /* "invent" an unread article for read_news */
  1896.       gh->last_article = 1;
  1897. **************
  1898. *** 392,398
  1899.       
  1900.       if (strcmp(group, "NEW") == 0) {
  1901.       gs_mode = GS_NEW_GROUP;
  1902. !     gs_length = 127;
  1903.       } else {
  1904.       gs_mode = GS_PREFIX;
  1905.       
  1906. --- 392,398 -----
  1907.       
  1908.       if (strcmp(group, "NEW") == 0) {
  1909.       gs_mode = GS_NEW_GROUP;
  1910. !     gs_length = 0;
  1911.       } else {
  1912.       gs_mode = GS_PREFIX;
  1913.       
  1914.  
  1915. *** /usr/storm/nn6.3.0/term.c
  1916. --- term.c
  1917. **************
  1918. *** 213,218
  1919.       
  1920.       if ((term_name = getenv("TERM")) == NULL)
  1921.       user_error("No TERM variable in enviroment");
  1922.       
  1923.   #ifdef USE_TERMINFO
  1924.       setupterm(0,1,0);
  1925. --- 213,224 -----
  1926.       
  1927.       if ((term_name = getenv("TERM")) == NULL)
  1928.       user_error("No TERM variable in enviroment");
  1929. + #ifdef HAVE_TERMIO
  1930. +     ioctl(0, TCGETA, &norm_tty);
  1931. + #else    
  1932. +     ioctl(0, TIOCGETP, &norm_tty);
  1933. + #endif
  1934.       
  1935.   #ifdef USE_TERMINFO
  1936.       setupterm(0,1,0);
  1937. **************
  1938. *** 291,300
  1939.       cookie_size = two_cookies = 0;
  1940.       
  1941.       
  1942. - #ifdef HAVE_TERMIO
  1943. -     
  1944. -     ioctl(0, TCGETA, &norm_tty);
  1945. -     
  1946.       raw_tty = norm_tty;
  1947.       
  1948.       raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR);
  1949. --- 297,302 -----
  1950.       cookie_size = two_cookies = 0;
  1951.       
  1952.       
  1953.       raw_tty = norm_tty;
  1954.       
  1955.   #ifdef HAVE_TERMIO
  1956. **************
  1957. *** 297,302
  1958.       
  1959.       raw_tty = norm_tty;
  1960.       
  1961.       raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR);
  1962.       raw_tty.c_iflag |= IGNBRK|IGNPAR|ISTRIP;
  1963.       raw_tty.c_oflag &= ~OPOST;
  1964. --- 299,305 -----
  1965.       
  1966.       raw_tty = norm_tty;
  1967.       
  1968. + #ifdef HAVE_TERMIO
  1969.       raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR);
  1970.       raw_tty.c_iflag |= IGNBRK|IGNPAR|ISTRIP;
  1971.       raw_tty.c_oflag &= ~OPOST;
  1972. **************
  1973. *** 307,315
  1974.       raw_tty.c_cc[VEOL] = ((raw_tty.c_cflag & CBAUD) > B1200) ? 1 : 2;
  1975.       
  1976.   #else    
  1977. -     
  1978. -     ioctl(0, TIOCGETP, &norm_tty);
  1979. -     
  1980.       ioctl(0, TIOCGETC, &norm_chars);
  1981.       
  1982.   #ifdef TIOCGLTC
  1983. --- 310,315 -----
  1984.       raw_tty.c_cc[VEOL] = ((raw_tty.c_cflag & CBAUD) > B1200) ? 1 : 2;
  1985.       
  1986.   #else    
  1987.       ioctl(0, TIOCGETC, &norm_chars);
  1988.       
  1989.   #ifdef TIOCGLTC
  1990. **************
  1991. *** 318,325
  1992.       
  1993.       ospeed = norm_tty.sg_ospeed;
  1994.       if (ospeed < B2400) slow_mode++;
  1995. -     
  1996. -     raw_tty = norm_tty;
  1997.       
  1998.       raw_tty.sg_flags |= RAW;
  1999.       raw_tty.sg_flags &= ~(ECHO|CRMOD);
  2000. --- 318,323 -----
  2001.       
  2002.       ospeed = norm_tty.sg_ospeed;
  2003.       if (ospeed < B2400) slow_mode++;
  2004.       
  2005.       raw_tty.sg_flags |= RAW;
  2006.       raw_tty.sg_flags &= ~(ECHO|CRMOD);
  2007.  
  2008. *** /usr/storm/nn6.3.0/xmakefile
  2009. --- xmakefile
  2010. **************
  2011. *** 55,61
  2012.       init.o variable.o term.o keymap.o macro.o regexp.o \
  2013.       menu.o more.o rc.o group.o folder.o \
  2014.       articles.o sequence.o selection.o kill.o \
  2015. !     answer.o reroute.o save.o unshar.o execute.o \
  2016.       pack_date.o pack_name.o pack_subject.o news.o digest.o match.o 
  2017.   
  2018.   MAIL = nnmail.o reroute.o global.o options.o update.o
  2019. --- 55,61 -----
  2020.       init.o variable.o term.o keymap.o macro.o regexp.o \
  2021.       menu.o more.o rc.o group.o folder.o \
  2022.       articles.o sequence.o selection.o kill.o \
  2023. !     answer.o reroute.o save.o unshar.o decode.o execute.o \
  2024.       pack_date.o pack_name.o pack_subject.o news.o digest.o match.o 
  2025.   
  2026.   MAIL = nnmail.o reroute.o global.o options.o update.o
  2027. **************
  2028. *** 195,200
  2029.   date_regexp.o:    config.h global.h data.h
  2030.   
  2031.   db.o:        db.c config.h global.h data.h db.h
  2032.   
  2033.   digest.o:    digest.c config.h global.h data.h news.h match.h
  2034.   
  2035. --- 195,202 -----
  2036.   date_regexp.o:    config.h global.h data.h
  2037.   
  2038.   db.o:        db.c config.h global.h data.h db.h
  2039. + decode.o:    decode.c config.h
  2040.   
  2041.   digest.o:    digest.c config.h global.h data.h news.h match.h
  2042.   
  2043.  
  2044.